//
// Created by jerry on 2024/9/20.
//

#ifndef DATASTRUCTURE_UNIQUE_PTR_H
#define DATASTRUCTURE_UNIQUE_PTR_H
namespace mycode{
    template <class T>
    struct Dellocker{
        void operator()(T* ptr){
            delete ptr;
        }

    };

    template <class T,class Del = Dellocker<T>>
    class unique_ptr{
    public:
        typedef unique_ptr<T,Del> self;
        typedef unique_ptr<T,Del>& ref;
        typedef unique_ptr<T,Del>* ptr;
        T& operator*(){return *_ptr; }
        T* operator->() { return _ptr; }
        explicit unique_ptr(T* i_ptr):_ptr(i_ptr){}//unique_ptr这里只能支持构造函数,不能支持拷贝构造
        ~unique_ptr(){
            _del(_ptr);
            _ptr = nullptr;
        }
    private:
        ref operator=(const unique_ptr<T,Del>& ut){}//反正都是不能用的干脆直接不写
        explicit unique_ptr(const unique_ptr<T,Del>& self):_ptr(self._ptr){}
        T* _ptr = nullptr;
        Del _del;
    };

}
#endif //DATASTRUCTURE_UNIQUE_PTR_H
